package Persistencia;

import java.sql.*;
import java.util.*;

import Modelo.*;


public class AdministracionPersistenciaDescuento{
	
	private static AdministracionPersistenciaDescuento instance;
	
	private AdministracionPersistenciaDescuento(){
		
	}
	 
	public static AdministracionPersistenciaDescuento getInstance(){
		if(instance==null)
			instance = new AdministracionPersistenciaDescuento();
		return instance;
	}
	

	public EstrategiaCosto buscarEstrategia(String descripcion) {
		EstrategiaCosto result = null;
		Connection con = PoolConnection.getPoolConnection().getConnection();
	
		try{
			String query = "SELECT codigo,descripcion, estado,prioridad,descuento,exclusiva,entidad,combinado FROM Estrategias WHERE descripcion = ?";
			
			PreparedStatement ps = con.prepareStatement(query);
			ps.setString(1,descripcion);
			ResultSet rs = ps.executeQuery();
			while (rs.next()) {
				if (rs.getString(2) == "porKm"){
					result = new PorKm(rs.getString(2), rs.getString(3), rs.getInt(4), rs.getInt(6), rs.getString(7), rs.getFloat(5));
				}
				if (rs.getString(2) == "porDia"){
					result = new PorDia( rs.getString(2), rs.getString(3), rs.getInt(4), rs.getInt(6), rs.getString(7), rs.getFloat(5));
				}
				if (rs.getInt(8) == 1){
					result = new Combinado ( rs.getString(2), rs.getString(3), rs.getInt(4), rs.getInt(6), rs.getString(7), buscarCombinaciones(rs.getInt(1)));
				} else {
					result = new Descuento ( rs.getString(2), rs.getString(3), rs.getInt(4), rs.getInt(6), rs.getString(7), rs.getFloat(5));
				} 
				
			}
			
		
			PoolConnection.getPoolConnection().closeConnections();
		}catch(Exception e){
			System.err.print("Error al Buscar Estrategias");
			PoolConnection.getPoolConnection().closeConnections();
		}
		
		return result;
	}
	
	public EstrategiaCosto buscarEstrategia(int codigo) {
		EstrategiaCosto result = null;
		Connection con = PoolConnection.getPoolConnection().getConnection();
	
		try{
			String query = "SELECT codigo,descripcion, estado,prioridad,descuento,exclusiva,entidad,combinado FROM Estrategias WHERE codigo = ?";
			
			PreparedStatement ps = con.prepareStatement(query);
			ps.setInt(1,codigo);
			ResultSet rs = ps.executeQuery();
			while (rs.next()) {
				if (rs.getString(2) == "porKm"){
					result = new PorKm(rs.getString(2), rs.getString(3), rs.getInt(4), rs.getInt(6), rs.getString(7), rs.getFloat(5));
				}
				if (rs.getString(2) == "porDia"){
					result = new PorDia( rs.getString(2), rs.getString(3), rs.getInt(4), rs.getInt(6), rs.getString(7), rs.getFloat(5));
				}
				if (rs.getInt(6) == 1){
					result = new Descuento ( rs.getString(2), rs.getString(3), rs.getInt(4), rs.getInt(6), rs.getString(7), rs.getFloat(5));
				} 
				if (rs.getInt(8) == 1){
					result = new Combinado ( rs.getString(2), rs.getString(3), rs.getInt(4), rs.getInt(6), rs.getString(7), buscarCombinaciones(rs.getInt(1)));
				}
			}
			
		
			PoolConnection.getPoolConnection().closeConnections();
		}catch(Exception e){
			System.err.print("Error al Buscar Estrategias");
			PoolConnection.getPoolConnection().closeConnections();
		}
		
		return result;
	}
	
	public Vector<EstrategiaCosto> buscarEstrategias(String estado) {
		Vector<EstrategiaCosto> result = new Vector<EstrategiaCosto>();
		EstrategiaCosto estrategia = null;
		Connection con = PoolConnection.getPoolConnection().getConnection();
	
		try{
			String query = "SELECT codigo,descripcion, estado,prioridad,descuento,exclusiva,entidad,combinado FROM Estrategias WHERE estado = ? ORDER BY prioridad";
			
			PreparedStatement ps = con.prepareStatement(query);
			ps.setString(1,estado);
			ResultSet rs = ps.executeQuery();
			while (rs.next()) {
				if (rs.getString(2) == "porKm"){
					estrategia = new PorKm( rs.getString(2), rs.getString(3), rs.getInt(4), rs.getInt(6), rs.getString(7), rs.getFloat(5));
				}
				if (rs.getString(2) == "porDia"){
					estrategia = new PorDia( rs.getString(2), rs.getString(3), rs.getInt(4), rs.getInt(6), rs.getString(7), rs.getFloat(5));
				}
				if (rs.getInt(6) == 1){
					estrategia = new Descuento (rs.getString(2), rs.getString(3), rs.getInt(4), rs.getInt(6), rs.getString(7), rs.getFloat(5));
				} 
				if (rs.getInt(8) == 1){
					estrategia = new Combinado ( rs.getString(2), rs.getString(3), rs.getInt(4), rs.getInt(6), rs.getString(7), buscarCombinaciones(rs.getInt(1)));
				}
				result.add(estrategia);
			}
			
		
			PoolConnection.getPoolConnection().closeConnections();
		}catch(Exception e){
			System.err.print("Error al Buscar Estrategias");
			PoolConnection.getPoolConnection().closeConnections();
		}
		
		return result;
	}
	
	public Vector<EstrategiaCosto> buscarEstrategias() {
		Vector<EstrategiaCosto> result = new Vector<EstrategiaCosto>();
		EstrategiaCosto estrategia = null;
		Connection con = PoolConnection.getPoolConnection().getConnection();
	
		try{
			String query = "SELECT codigo,descripcion, estado,prioridad,descuento,exclusiva,entidad,combinado FROM Estrategias ORDER BY codigo";
			
			PreparedStatement ps = con.prepareStatement(query);
			ResultSet rs = ps.executeQuery();
			while (rs.next()) {
				deleteDescuento(rs.getInt(1));
				if (rs.getString(2) == "porKm"){
					estrategia = new PorKm(rs.getString(2), rs.getString(3), rs.getInt(4), rs.getInt(6), rs.getString(7), rs.getFloat(5));
				}
				if (rs.getString(2) == "porDia"){
					estrategia = new PorDia(rs.getString(2), rs.getString(3), rs.getInt(4), rs.getInt(6), rs.getString(7), rs.getFloat(5));
				}if (rs.getInt(8) == 1){
					estrategia = new Combinado ( rs.getString(2), rs.getString(3), rs.getInt(4), rs.getInt(6), rs.getString(7), buscarCombinaciones(rs.getInt(1)));
				}
				else{
					estrategia = new Descuento (rs.getString(2), rs.getString(3), rs.getInt(4), rs.getInt(6), rs.getString(7), rs.getFloat(5));
				} 
				result.add(estrategia);
			}
			
		
			PoolConnection.getPoolConnection().closeConnections();
		}catch(Exception e){
			System.err.print("Error al Buscar Estrategias");
			PoolConnection.getPoolConnection().closeConnections();
		}
		
		return result;
	}
	
	public void insert(EstrategiaCosto estrategia)
	{
		//Obtener conexion BD 
		Connection con = PoolConnection.getPoolConnection().getConnection();
		
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia insert en tabla destino
			String senten = "INSERT INTO estrategias (codigo,descripcion, estado,prioridad,descuento,exclusiva,entidad,combinado) VALUES (?,?,?,?,?,?,?,?)" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1,estrategia.getCodigo());
			ps.setString(2,estrategia.getDescripcion());
			ps.setString(3,estrategia.getEstado());
			ps.setInt(4,estrategia.getPrioridad());
			ps.setFloat(5, estrategia.getDescuento());
			ps.setInt(6, estrategia.getExclusivo());
			ps.setString(7, estrategia.getEntidad());
			ps.setInt(8, estrategia.getCombinado());
			if (estrategia.getCombinado() == 1){
				Combinado comb = (Combinado) estrategia;
				for (int i = 0; i> comb.getCombinaciones().size() ; i++){
					insertCombinacion(estrategia.getCodigo(),comb.getCombinaciones().elementAt(i).getCodigo());
				}
			}
			
			ps.execute();
			
			PoolConnection.getPoolConnection().closeConnections();
			
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Insertar Cliente: " + e.getMessage());
				System.out.println("Stack Trace al Insertar Cliente: " + e.getStackTrace());
				PoolConnection.getPoolConnection().closeConnections();
	      }
	      
	}
	
	public void update(EstrategiaCosto estrategia)
	{
		//Obtener conexion BD 
		Connection con = PoolConnection.getPoolConnection().getConnection();
		
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia insert en tabla destino
			String senten = "Update estrategias SET codigo = ? ,descripcion =? , estado =? ,prioridad=? ,descuento=?,exclusiva=?,entidad=?,combinado=? where codigo =?" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1,estrategia.getCodigo());
			ps.setString(2,estrategia.getDescripcion());
			ps.setString(3,estrategia.getEstado());
			ps.setInt(4,estrategia.getPrioridad());
			ps.setFloat(5, estrategia.getDescuento());
			ps.setInt(6, estrategia.getExclusivo());
			ps.setString(7, estrategia.getEntidad());
			ps.setInt(8, estrategia.getCombinado());
			ps.setInt(9, estrategia.getCodigo());
			if (estrategia.getCombinado() == 1){
				deleteDescuento(estrategia.getCodigo());
				Combinado comb = (Combinado) estrategia;
				for (int i = 0; i> comb.getCombinaciones().size() ; i++){
					insertCombinacion(estrategia.getCodigo(),comb.getCombinaciones().elementAt(i).getCodigo());
				}
			}
			
			ps.execute();
			
			PoolConnection.getPoolConnection().closeConnections();
			
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Insertar Cliente: " + e.getMessage());
				System.out.println("Stack Trace al Insertar Cliente: " + e.getStackTrace());
				PoolConnection.getPoolConnection().closeConnections();
	      }
	      
	}
	
	public Vector<EstrategiaCosto> buscarCombinaciones(int codigo) {
		Vector<EstrategiaCosto> result = new Vector<EstrategiaCosto>();
		EstrategiaCosto estrategia = null;
		Connection con = PoolConnection.getPoolConnection().getConnection();
	
		try{
			String query = "SELECT codigo,codigoCombinado FROM CombinacionesEstrategias WHERE codigo = ?";
			
			PreparedStatement ps = con.prepareStatement(query);
			ps.setInt(1,codigo);
			ResultSet rs = ps.executeQuery();
			while (rs.next()) {
				if (rs.getString(2) == "porKm"){
					estrategia = new PorKm(rs.getString(2), rs.getString(3), rs.getInt(4), rs.getInt(6), rs.getString(7), rs.getFloat(5));
				}
				if (rs.getString(2) == "porDia"){
					estrategia = new PorDia(rs.getString(2), rs.getString(3), rs.getInt(4), rs.getInt(6), rs.getString(7), rs.getFloat(5));
				}
				if (rs.getInt(6) == 1){
					estrategia = new Descuento ( rs.getString(2), rs.getString(3), rs.getInt(4), rs.getInt(6), rs.getString(7), rs.getFloat(5));
				} 
				if (rs.getInt(8) == 1){
					estrategia = new Combinado ( rs.getString(2), rs.getString(3), rs.getInt(4), rs.getInt(6), rs.getString(7),buscarCombinaciones(rs.getInt(1)));
				}
			result.add(estrategia);
			}
			
		
			PoolConnection.getPoolConnection().closeConnections();
		}catch(Exception e){
			System.err.print("Error al Buscar CombinacionesEstrategias");
			PoolConnection.getPoolConnection().closeConnections();
		}
		
		return result;
	}
	
	public void insertCombinacion(int codigo, int codigoCombinado)
	{
		//Obtener conexion BD 
		Connection con = PoolConnection.getPoolConnection().getConnection();
		
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia insert en tabla destino
			String senten = "INSERT INTO CombinacionesEstrategias (codigo,codigoCombinado) VALUES (?,?)" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1, codigo);
			ps.setInt(2,codigoCombinado);

			ps.execute();
			
			PoolConnection.getPoolConnection().closeConnections();
			
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Insertar Combinacion: " + e.getMessage());
				System.out.println("Stack Trace al Insertar Combinacion: " + e.getStackTrace());
				PoolConnection.getPoolConnection().closeConnections();
	      }
	      
	}
	
	public void deleteCombinacion(int codigo, int codigoCombinado)
	{
		//Obtener conexion BD 
		Connection con = PoolConnection.getPoolConnection().getConnection();
		
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia insert en tabla destino
			String senten = "delete FROM CombinacionesEstrategias WHERE codigo =? AND codigoCombinado =?" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1, codigo);
			ps.setInt(2,codigoCombinado);

			ps.execute();
			
			PoolConnection.getPoolConnection().closeConnections();
			
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Insertar Combinacion: " + e.getMessage());
				System.out.println("Stack Trace al Insertar Combinacion: " + e.getStackTrace());
				PoolConnection.getPoolConnection().closeConnections();
	      }
	      
	}
	
	public void deleteCombinaciones(int codigo)
	{
		//Obtener conexion BD 
		Connection con = PoolConnection.getPoolConnection().getConnection();
		
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia insert en tabla destino
			String senten = "delete FROM CombinacionesEstrategias WHERE codigo =? " ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1, codigo);

			ps.execute();
			
			PoolConnection.getPoolConnection().closeConnections();
			
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Insertar Combinacion: " + e.getMessage());
				System.out.println("Stack Trace al Insertar Combinacion: " + e.getStackTrace());
				PoolConnection.getPoolConnection().closeConnections();
	      }
	      
	}
	
	public void deleteDescuento(int codigo)
	{
		//Obtener conexion BD 
		Connection con = PoolConnection.getPoolConnection().getConnection();
		
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia insert en tabla destino
			String senten = "delete FROM Estrategias WHERE codigo =? " ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1, codigo);

			ps.execute();
			deleteCombinaciones(codigo);
			
			PoolConnection.getPoolConnection().closeConnections();
			
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Insertar Combinacion: " + e.getMessage());
				System.out.println("Stack Trace al Insertar Combinacion: " + e.getStackTrace());
				PoolConnection.getPoolConnection().closeConnections();
	      }
	      
	}
	
}

